﻿using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Services.Dialogs;
using ProductionLine.Models;
using ProductionLine.Modules.Chart;
using ProductionLine.Modules.DataQuery;
using ProductionLine.Modules.Device;
using ProductionLine.Modules.Flow;
using ProductionLine.Modules.Formula;
using ProductionLine.Modules.Index;
using ProductionLine.Modules.Log;
using ProductionLine.Modules.Login;
using ProductionLine.Modules.Params;
using ProductionLine.Modules.ShareLib;
using ProductionLine.Modules.ShareLib.Helpers;
using ProductionLine.Modules.ShareLib.Models;
using ProductionLine.Modules.Users;
using ProductionLine.Services;
using ProductionLine.Services.Interfaces;
using ProductionLine.ViewModels;
using ProductionLine.Views;
using System;
using System.Windows;
using ModbusTcpConfig = ProductionLine.Modules.ShareLib.Models.ModbusTcpConfig;

namespace ProductionLine {
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App {

        protected override void RegisterTypes(IContainerRegistry containerRegistry) {
            containerRegistry.RegisterSingleton<IMessageService, MessageService>();
            containerRegistry.RegisterForNavigation<MainView, MainViewModel>();
            containerRegistry.RegisterSingleton<GlobalConfig>();


            #region 注册配置文件
            //1. 从json中读取配置,创建配置构建器,然后使用Build()方法构建配置根对象
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Environment.CurrentDirectory + "\\Configs")//json地址
                .AddJsonFile("appsettings.json", false, true).Build();// (配置文件名称,文件必须存在,文件修改时(自动重载))
            // 2. 实现单例模式注入 IConfiguration 接口
            containerRegistry.RegisterInstance<IConfiguration>(configuration);//可以在后面加 . 接下面配置日志
            //3.改造 SqlSugarHelper,配置 SqlSugar 数据库连接,静态方法,直接调用吧,不注册了
            var parseResult = Enum.TryParse<SqlSugar.DbType>(configuration["SqlParam:DbType"], out var dbType); // 解析数据库类型枚举 (需处理转换失败的情况)
            var connectionString = configuration["SqlParam:ConnectionString"];

            if (parseResult) {  // 当数据库类型解析成功时初始化SqlSugar
                SqlSugarHelper.AddSqlSugarSetup(dbType, connectionString);  // 将数据库配置注入SqlSugarHelper静态类
            }
            //4. 获取PlcParam对象
            var plcParam = configuration.GetSection("PlcParam").Get<PlcParam>();
            containerRegistry.RegisterInstance(plcParam);  // 注册PlcParam对象
                                                           //获取momdbus tcp配置信息
            var modbusTcpConfig = configuration.GetSection("ModbusTcpConfig").Get<ModbusTcpConfig>();
            containerRegistry.RegisterInstance(modbusTcpConfig);  // 注册PlcParam对象

            //5.UserSession
            containerRegistry.RegisterSingleton<UserSession>();
            

            #endregion

        }

        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) {
            moduleCatalog.AddModule<LoginModule>();
            moduleCatalog.AddModule<ShareLibModule>();
            moduleCatalog.AddModule<IndexModule>();
            moduleCatalog.AddModule<DeviceModule>();
            moduleCatalog.AddModule<ParamsModule>();
            moduleCatalog.AddModule<DataQueryModule>();
            moduleCatalog.AddModule<ChartModule>();
            moduleCatalog.AddModule<FlowModule>();
            moduleCatalog.AddModule<FormulaModule>();
            moduleCatalog.AddModule<LogModule>();
            moduleCatalog.AddModule<UserModule>();
        }

        protected override Window CreateShell() {

            return Container.Resolve<MainView>();
        }

        protected override void OnInitialized() {
            //我准备在app.xaml.cs页面调用对话框服务→登录界面→这是可以实现的!!!
            // 从容器解析对话框服务
            var dialogService = Container.Resolve<IDialogService>();
            // 打开登录对话框
            dialogService.ShowDialog("LoginView", callback => {
                // 处理对话框关闭结果
                if (callback.Result != ButtonResult.OK) {//没登陆
                    // 非成功登录时退出应用
                    Environment.Exit(0);
                    return;
                }
                //登录成功,则进入我们的主窗口,登录前操作
                // 这里可以写一些登录前的操作,比如检查权限,初始化数据等等
                // 登录成功后,进入主窗口,不用别的操作,CreateShell中配置了
                var mainViewModel = Container.Resolve<MainView>().DataContext as MainViewModel;
                mainViewModel.SetNavigate(); // 设置默认导航


                // 调用基类初始化方法
                base.OnInitialized();
            });
        }
    }
}
